perm filename USC2SU.SAI[PIC,TOB] blob sn#229563 filedate 1976-07-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	convert usc format to su format files
C00003 00003	RECORD_POINTER (IO) IFILE comment input file, channel,etc
C00007 ENDMK
C⊗;
comment convert usc format to su format files;
BEGIN "USC TO SU"

  EXTERNAL PROCEDURE BAIL;

  REQUIRE "ABBREV.1D[S1,TOB]" SOURCE_FILE;
  REQUIRE "STD.12H[S1,TOB]" SOURCE_FILE;
  REQUIRE "STD[S1,TOB]" LOAD_MODULE;

  REQUIRE "FILEIO.2E[S2,TOB]" SOURCE_FILE;
  REQUIRE "FILEIO[S2,TOB]" LOAD_MODULE;

RECORD_POINTER (IO) IFILE; comment input file, channel,etc;
RECORD_POINTER (IO) OFILE;  comment output file,channel,etc;
STRING NAME; comment file name;

NAME←ASK_STRING(CRLF&"FILE NAME ");
NEWFILE(IFILE,NAME,"USC","PIC,HE");
OPEN_I(IFILE,BINARY_FILE);
NEWFILE(OFILE,NAME,"SU","PIC,HE");
OPEN_O(OFILE,BINARY_FILE);

BEGIN "HEADER"
INTEGER UNPACKED;  comment nonzero if file is unpacked;
INTEGER BITS,BYTES;
INTEGER X1,Y1,X2,Y2;
INTEGER WDS_LINE,SIZE_FILE;
INTEGER I;

BITS←8;
X1←Y1←1;
X2←Y2←512;
WRITE(BITS);WRITE(X1);WRITE(X2);WRITE(Y1);WRITE(Y2);
PRINT(CRLF);
COMMENT MODIFY(X2);
PRINT(CRLF,"USC files are usually packed 4 bytes per word.");
PRINT(CRLF,"If unpacked, two bytes per word.",CRLF);
COMMENT MODIFY(UNPACKED);
COMMENT BAIL;

WORDOUT(IO:CH[OFILE],-1); comment first word identifier;
WORDOUT(IO:CH[OFILE],BITS);comment number of bits;
BYTES←WORD_SIZE%BITS;comment bytes per word;
WDS_LINE←(X2-X1+BYTES)%BYTES;
WORDOUT(IO:CH[OFILE],WDS_LINE);
WORDOUT(IO:CH[OFILE],Y1);
WORDOUT(IO:CH[OFILE],Y2);
WORDOUT(IO:CH[OFILE],X1);
WORDOUT(IO:CH[OFILE],X2);
SIZE_FILE←WDS_LINE*(Y2-Y1+1);
WORDOUT(IO:CH[OFILE],XWD(-SIZE_FILE,'200));
FOR I←1 STEP 1 UNTIL 3 DO WORDOUT(IO:CH[OFILE],0);
FOR I←'13 STEP 1 UNTIL '177 DO WORDOUT(IO:CH[OFILE],0);

IF ¬UNPACKED THEN
  INOUT(IO:CH[IFILE],IO:CH[OFILE],SIZE_FILE);

IF UNPACKED THEN BEGIN "PACKW"
  INTEGER X,Y; comment indices;

        INTEGER M2,M4; comment masks for bytes 2 and 4;
        M2←'377 LSH 20;
        M4←'377 LSH 4; comment byte 4;
        PRINT(CRLF,"Y ");
  FOR Y←Y1 STEP 1 UNTIL Y2 DO BEGIN "ROW"
      IF Y MOD 50 = 0 THEN PRINT (Y);
    FOR X←X1 STEP 4 UNTIL X2 DO BEGIN "COLUMN"
      INTEGER W;  comment input word;
      INTEGER WO; comment packed output word;

      W←WORDIN(IO:CH[IFILE]);
      comment get the first two bytes w=0,b1,0,b2,0;
      WO←((W LAND M2) LSH 8)
        +((W LAND M4) LSH 16);
       W←WORDIN(IO:CH[IFILE]);
       comment get the next two bytes w=0,b3,0,b4,0;
       WO←WO+((W LAND M2) LSH -8)
         +(W LAND M4);
      WORDOUT(IO:CH[OFILE],WO);
      END "COLUMN";
    END "ROW";
  END "PACKW";
  CLOSE(IO:CH[OFILE]);
END "HEADER";
END "USC TO SU";